#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/12/11 22:39
# @Author  : 唐松
# @File    : connectMysql.py
# @Software: PyCharm

from configs.config import read_config_file
import pymysql
from util_tools.logger_util import logs


class ConnectMysql:
    def __init__(self):
        # 初始化数据库连接配置, 从配置文件中读取数据库连接参数
        try:
            self.conf = {
                'host': read_config_file('mysql', 'host'),
                'port': int(read_config_file('mysql', 'port')),
                'user': read_config_file('mysql', 'user'),
                'password': read_config_file('mysql', 'password'),
                'database': read_config_file('mysql', 'database')
            }
            self.conn = None
            self.cursor = None
            self.connect()
        except Exception as e:
            logs.error(f'读取数据库配置失败: {e}')
            raise e

    def connect(self):
        try:
            # 尝试建立数据库连接
            self.conn = pymysql.connect(**self.conf)
            # 创建一个游标对象, 使用字典游标类型返回结果
            self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
        except pymysql.MySQLError as e:
            # 如果连接数据库失败, 打印错误信息并将连接和游标设为None
            logs.error(f'连接数据库失败, 失败原因: {e}')
            self.conn = None
            self.cursor = None
            raise e

    def close(self):
        # 关闭游标和数据库连接
        if self.conn is not None and self.cursor is not None:
            # 关闭游标
            self.cursor.close()
            # 关闭数据库连接
            self.conn.close()
        return True

    def query(self, sql, fetchall=False):
        """
        执行SQL查询并返回结果。
        :param sql: 要执行的SQL语句
        :param fetchall: 是否获取所有结果, 默认为False
        :return: 查询结果, 可能是单个记录或记录列表
        """
        try:
            # 如果连接或游标不存在, 重新连接数据库
            if not self.conn or not self.cursor:
                self.connect()
            # 执行SQL查询
            self.cursor.execute(sql)
            # 根据fetchall参数决定返回单条或多条记录
            if fetchall:
                return self.cursor.fetchall()
            else:
                return self.cursor.fetchone()
        except pymysql.MySQLError as e:
            # 如果查询出现异常, 打印错误信息并抛出异常
            logs.error(f'查询数据库内容出现异常, {e}')
            raise e

    def uid_db(self, sql):
        """
        更新、插入、删除操作的方法
        :param sql: 要执行的SQL语句
        :return:
        """
        try:
            # 如果连接或游标不存在, 重新连接数据库
            if not self.conn or not self.cursor:
                self.connect()
            # 执行SQL语句
            self.cursor.execute(sql)
            # 打印受影响的行数
            logs.info("影响行数" + str(self.cursor.rowcount))
            # 提交事务
            self.conn.commit()
        except pymysql.MySQLError as e:
            # 如果执行SQL语句出现异常, 回滚事务并打印错误信息
            self.conn.rollback()
            logs.error(f'执行SQL语句出现异常, {e}')
            raise e

    def __del__(self):
        # 析构函数, 关闭数据库连接
        self.close()


if __name__ == '__main__':
    db = ConnectMysql()
    res = db.query('SELECT name, fee FROM testcase.`user` WHERE id=4;')
    print(res)
    # case = db.uid_db(
    #     'INSERT INTO testcase.dbcase (name, demo) VALUES("test2", "test2"),("test3", "test3"),("test4", "test4");')
